home *** CD-ROM | disk | FTP | other *** search
- Path: news.larc.nasa.gov!amiga-request
- From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
- Subject: v91i067: NoDelete 1.5a - intercept DeleteFile() requests, Part01/01
- Reply-To: hoover@math4.uni-bielefeld.de (Uwe Sch"urkamp)
- Newsgroups: comp.sources.amiga
- Message-ID: <comp.sources.amiga:v91i067@ab20.larc.nasa.gov>
- Date: 21 Mar 91 12:49:12 GMT
- Approved: tadguy@uunet.UU.NET (Tad Guy)
- X-Mail-Submissions-To: amiga@uunet.uu.net
- X-Post-Discussions-To: comp.sys.amiga.misc
-
- Submitted-by: hoover@math4.uni-bielefeld.de (Uwe Sch"urkamp)
- Posting-number: Volume 91, Issue 067
- Archive-name: utilities/nodelete-1.5a/part01
-
- [ includes uuencoded executable ...tad ]
-
- CHANGES TO VERSION 1.4: MAR 1991
- Switched to ARP (finally). This great bunch of routines should have
- experienced a wide enough distribution by now to make this acceptable.
- Cheers to everyone involved in this project! ARP is used to do the pattern
- matching on filenames. No more restriction is made on the patterns. They
- can be complete filenames or just patterns, with every ARP wildcard
- allowed. I forgot the name of the guy who suggested this one, and answers
- by UUCP is not a favourite of math4.unibi.de. Anyway, as soon as this is
- implemented, you'll get a "thank you", mate!
-
- WHAT IT DOES
- NoDelete enables you erraneous humans to once again reflect on the
- righteousness of your decisions concerning the deleting of files on
- AmigaDos devices. If you try to delete a file or a program tries to remove
- it, this is mostly done via DeleteFile() of the dos.library. When
- executed, NoDelete bends this vector to its own routine which brings up
- this cute little requester on the active window. This requester contains
- the name of the file that the system is trying to delete. If you really
- want to delete this file, click to the "Yes, Delete!" gadget. If not,
- click to the "Oops, no way!"-Gadget of the requester. NoDelete works just
- fine with aliases, wildcards etc. For problems see the "known
- bugs"-section of this text.
-
-
- #!/bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 1 (of 1)."
- # Contents: nodelete.c nodelete.doc nodelete.uu
- # Wrapped by tadguy@ab20 on Thu Mar 21 07:49:10 1991
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'nodelete.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'nodelete.c'\"
- else
- echo shar: Extracting \"'nodelete.c'\" \(6689 characters\)
- sed "s/^X//" >'nodelete.c' <<'END_OF_FILE'
- X/* NoDelete V1.5A (C) HooverSoft 1991
- X
- X cc NoDelete +L
- X ln NoDelete -la -lc32
- X
- X
- X*/
- X
- X
- X#ifdef AZTEC_C /* Works under Manx, convert it to Lattice */
- X /* if you don't mind the hassle... */
- X
- X#include<libraries/arpbase.h>
- X#include<intuition/intuition.h>
- X#include<intuition/intuitionbase.h>
- X#include<libraries/dos.h>
- X#include<libraries/dosextens.h>
- X#include<stdio.h>
- X/* #define DEBUG 1 */
- X
- Xchar bodystring[80],patterns[10][10], titlebak[80], title[80];
- XULONG answer, PAT_SET = 0L, howmany = 0L;
- XULONG OVERRIDE = 0L, SILENT = 0L;
- X
- X
- Xstruct NewWindow mywindow = {
- X 100,0, /* window XY origin relative to TopLeft of screen */
- X 350,10, /* window width and height */
- X 0,1, /* detail and block pens */
- X CLOSEWINDOW+VANILLAKEY, /* IDCMP flags */
- X WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+SIMPLE_REFRESH, /* other window flags */
- X NULL, /* first gadget in gadget list */
- X NULL, /* custom CHECKMARK imagery */
- X (UBYTE *)title, /* window title */
- X NULL, /* custom screen pointer */
- X NULL, /* custom bitmap */
- X 5,5, /* minimum width and height */
- X 640,110, /* maximum width and height */
- X WBENCHSCREEN /* destination screen type */
- X };
- X
- X
- Xstruct IntuiText body = {
- X 1,0,
- X JAM1|COMPLEMENT,
- X 30,16,
- X NULL,
- X NULL,
- X NULL
- X };
- X
- Xstruct IntuiText fbody = {
- X 1,0,
- X JAM1|COMPLEMENT,
- X 30,5,
- X NULL,
- X (UBYTE *) "System tries to fool around...",
- X &body
- X };
- X
- Xstruct IntuiText ok = {
- X 1,0,
- X JAM1|COMPLEMENT,
- X 6,3,
- X NULL,
- X (UBYTE *) "Yes, Delete!",
- X NULL
- X };
- X
- Xstruct IntuiText no = {
- X 1,0,
- X JAM1|COMPLEMENT,
- X 6,3,
- X NULL,
- X (UBYTE *) "Oops, No Way!",
- X NULL
- X };
- X
- X
- Xstruct IntuiMessage *msg, *GetMsg();
- X
- Xstruct IntuitionBase *IntuitionBase;
- Xstruct Window *mw, *aw, *OpenWindow();
- Xstruct DosBase *DosBase;
- Xstruct ArpBase *ArpBase;
- XUBYTE *filename;
- Xvoid *OpenLibrary();
- Xstruct Task *FindTask();
- X
- Xvoid NoDelete()
- X{
- X char parsed[10];
- X#asm
- X public _LVOSetProtection
- X
- X movem.l d0-d7/a0-a6,-(sp)
- X#endasm
- X geta4();
- X#asm
- X move.l d1,_filename
- X#endasm
- X
- X if(PAT_SET)
- X {
- X
- X for(answer=0L; answer < howmany; answer++)
- X {
- X PreParse(patterns[answer], parsed);
- X if( !PatternMatch(parsed, filename) ) /* this is new */
- X continue;
- X else
- X goto request;
- X }
- X }
- X else
- X goto request;
- X goto delete_anyway;
- X
- Xrequest:
- X strcpy(bodystring, "Delete File `");
- X strcat(bodystring, (char *)filename);
- X strcat(bodystring, "'?");
- X body.IText = (UBYTE *) bodystring;
- X aw = (struct Window *) IntuitionBase->ActiveWindow;
- X answer = (long)AutoRequest(aw, &fbody, &ok, &no, NULL, NULL, 360L, 61L);
- X if(!answer)
- X {
- X ;
- X#asm
- X movem.l (sp)+,d0-d7/a0-a6
- X move.l #1,d0
- X#endasm
- X return;
- X }
- X
- X if(answer)
- X {
- X
- Xdelete_anyway:
- X ;
- X#asm
- X
- X move.l _DosBase,a6
- X move.l #$70f7,d0 ;restore old vector
- X move.w d0,-72(a6)
- X move.l #$60000092,d0
- X move.l d0,-70(a6)
- X
- X tst.l _OVERRIDE
- X beq.s _dont_unprotect
- X
- X move.l _filename,d1
- X
- X
- X move.l #0,d2
- X jsr _LVOSetProtection(a6)
- X
- X_dont_unprotect:
- X
- X move.l _filename,d1
- X jsr -72(a6) ;DeleteFile() call
- X#endasm
- X
- X ;
- X
- X SetFunction(DosBase, -72L, &NoDelete);
- X
- X/* install our function */
- X
- X
- X#asm
- X movem.l (sp)+,d0-d7/a0-a6
- X move.l #1,d0
- X#endasm
- X return;
- X }
- X }
- X
- X
- Xvoid quit(why)
- XUBYTE *why;
- X{
- X if(!SILENT)
- X Printf(why);
- X SetTaskPri((struct Task *)FindTask(0L), 0L);
- X if(DosBase)
- X {
- X ;
- X#asm
- X move.l _DosBase,a6
- X move.l #$70f7,d0 ;restore old vector
- X move.w d0,-72(a6)
- X move.l #$60000092,d0
- X move.l d0,-70(a6)
- X#endasm
- X ;
- X }
- X
- X if (mw)
- X CloseWindowSafely(mw);
- X
- X if(ArpBase)
- X CloseLibrary(ArpBase);
- X exit(0L);
- X}
- X
- X/* test_nd() tests the DeleteFile vector to see if NoDelete is already
- X installed. Returns zero if NoDelete is installed, one if it is not.
- X*/
- X#asm
- X public _test_nd
- X_test_nd:
- X
- X move.l _DosBase,a6
- X cmpi.l #$60000092,-70(a6)
- X bne.s _is_there
- X moveq #1,d0
- X bra.s _fuckoff
- X_is_there:
- X moveq #0,d0
- X_fuckoff:
- X rts
- X#endasm
- X
- X
- Xvoid main(argc,argv)
- Xlong argc;
- Xchar *argv[];
- X {
- X
- X static UBYTE *msg1 = (UBYTE *)"Installing NoDelete...";
- X static UBYTE *msg2 = (UBYTE *)"done. NoDelete V1.5A (c) HooverSoft 1991. \
- XThis Program is FREEWARE.\n";
- X long i;
- X
- X if(! (ArpBase = (struct ArpBase *) OpenLibrary("arp.library",0L) ) )
- X quit("NoDelete needs arp.library\n");
- X
- X DosBase = (struct DosBase *) ArpBase->DosBase;
- X IntuitionBase = (struct IntuitionBase *) ArpBase->IntuiBase;
- X
- X strcpy(title, (UBYTE *) "NoDelete V1.5A (c) HooverSoft");
- X
- X
- X
- X
- X
- X
- X
- X#ifdef DEBUG
- X Printf("I found %ld patterns.\n", howmany);
- X#endif
- X
- X
- X
- X for(i=1; i<argc; i++)
- X {
- X#ifdef DEBUG
- X Printf("Scanning argv[%ld]: %s\n", i, (UBYTE *) argv[i] );
- X#endif
- X if( (char) argv[i][0] == '-')
- X {
- X switch( (char) argv[i][1] )
- X {
- X case 'y': if( atoi(argv[i+1]) <= 245L)
- X mywindow.TopEdge = atoi(argv[i+1]);
- X i++;
- X goto fuckoff;
- X break;
- X
- X case 'p': if(atoi(argv[i+1]) < 10L && atoi(argv[i+1]) > -20L)
- X SetTaskPri((struct Task *)FindTask(0L),\
- X (long)atoi(argv[i+1]));
- X else
- X SetTaskPri((struct Task *)FindTask(0L), -5L);
- X
- X i++;
- X goto fuckoff;
- X break;
- X
- X
- X case 'O': OVERRIDE = 1L;
- X goto fuckoff;
- X break;
- X
- X case 'S': SILENT = 1L;
- X goto fuckoff;
- X break;
- X
- X case default:
- X Printf("Unknown Option -%c\n", argv[i][1]);
- X goto fuckoff;
- X break;
- X }
- X /* end switch */
- X }/*end if */
- X else
- X {
- X PAT_SET = 1L;
- X if( howmany<10 )
- X strcpy(patterns[howmany], argv[i]);
- X#ifdef DEBUG
- X Printf("Copied %s, Result: %s\n", argv[i], patterns[i-1L]);
- X#endif
- X howmany++;
- X }
- Xfuckoff:
- X ;
- X /*end for */
- X }
- X
- X if(howmany)
- X strcat(title, (UBYTE *) " PAT SET");
- X else
- X {
- X PAT_SET = 0L;
- X strcat(title, (UBYTE *) " NO PAT");
- X }
- X
- X/* calculate dimension of TitleBar */
- X
- X mywindow.Width = ( strlen(title) * 8L) + 85L;
- X mywindow.LeftEdge = (640L-mywindow.Width) / 2L;
- X
- X if(!SILENT)
- X Printf(msg1);
- X
- X if( !test_nd() )
- X {
- X Printf("NoDelete already installed.\n");
- X CloseLibrary(DosBase);
- X CloseLibrary(IntuitionBase);
- X CloseLibrary(ArpBase);
- X exit(0L);
- X }
- X
- X mw = OpenWindow(&mywindow);
- X if(!mw)
- X quit("Could not open Window.\n\n");
- X if(!SILENT)
- X Printf(msg2);
- X
- X SetFunction(DosBase, -72L, &NoDelete);
- X
- X for(;;)
- X {
- X Wait(1L << mw->UserPort->mp_SigBit);
- Xgetmsg:
- X msg = GetMsg(mw->UserPort);
- X ReplyMsg(msg);
- X if (msg->Class == CLOSEWINDOW)
- X quit("NoDelete V1.5A exiting.\n\n");
- X if(msg->Class == VANILLAKEY)
- X {
- X strcpy(titlebak, (UBYTE *) "Patterns: ");
- X for(i=0L; i < howmany ; i++)
- X {
- X strcat(titlebak, patterns[i]);
- X strcat(titlebak, " ");
- X }
- X SetWindowTitles(mw, titlebak);
- X Wait(1L << mw->UserPort->mp_SigBit);
- X SetWindowTitles(mw, title);
- X ReplyMsg( GetMsg(mw->UserPort) );
- X }
- X
- X else
- X continue;
- X }
- X }
- X#endif
- X
- END_OF_FILE
- if test 6689 -ne `wc -c <'nodelete.c'`; then
- echo shar: \"'nodelete.c'\" unpacked with wrong size!
- fi
- # end of 'nodelete.c'
- fi
- if test -f 'nodelete.doc' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'nodelete.doc'\"
- else
- echo shar: Extracting \"'nodelete.doc'\" \(10917 characters\)
- sed "s/^X//" >'nodelete.doc' <<'END_OF_FILE'
- X *************************************************************************
- X * NoDelete V1.5A (C) HooverSoft Oct 30th, 1990 *
- X *************************************************************************
- X
- XUSAGE: 1> run NoDelete [patterns] [-p priority] [-y ypos] <ENTER>
- X from CLI only.
- X
- X HISTORY
- X
- X CHANGES TO VERSION 1.4: MAR 1991
- XSwitched to ARP (finally). This great bunch of routines should have
- Xexperienced a wide enough distribution by now to make this acceptable.
- XCheers to everyone involved in this project! ARP is used to do the pattern
- Xmatching on filenames. No more restriction is made on the patterns. They
- Xcan be complete filenames or just patterns, with every ARP wildcard
- Xallowed. I forgot the name of the guy who suggested this one, and answers
- Xby UUCP is not a favourite of math4.unibi.de. Anyway, as soon as this is
- Ximplemented, you'll get a "thank you", mate!
- X
- X CHANGES TO VERSION 1.35: OCT 1990
- XProgrammed two new options -O and -S (Cheers, John!). These options sort
- Xof "fix" a bug with NoDelete which used to override the file protection
- Xbit.
- X
- X CHANGES TO VERSION 1.3: SEP 1990
- XLots of changes. Thinking of writing a new documentation. Anyway,
- Xintroduced command line options -p and -y for run-time setting of priority
- Xof NoDelete and of vertical position of titlebar.
- X
- X CHANGES TO VERSION 1.2: AUG 1990
- XIntroduced the possibilty to give multiple patterns on startup. Lists
- Xpatterns when pressing a key while Nodelete's titlebar is active.
- X
- X CHANGES TO VERSION 1.1: Aug 1990
- XNoDelete now automatically centers the Dragbar on Screen and calculates the
- Xcorrect width for the window if a pattern is specified.
- X
- XNow works fine with AmiOmega. System won't crash if "Yes, Delete!" is
- Xselected.
- X
- XNow supports the use of patterns to ask confirmations only for special
- Xfiles ending in defined pattern. Will show the selected pattern in
- Xwindow's titlebar.
- X
- XNoDelete now checks if another NoDelete is already active and exits if
- Xtrue.
- X
- X CHANGES TO VERSION 1.01: Jul 1990
- XNow handles protected Files correctly. Previous version didn't complain if
- Xfile was delete protected.
- X
- XNoDelete sets its priority to a value of -5 directly after startup.
- X
- X CHANGES TO VERSION 1.00: June 1990
- XVersion 1.01 now restores the Dos Vector relative to _DosBase, so this
- Xprogram should work under Kickstart 1.3 as well. If someone already uses
- XKick 2.0, he or she should let me know if NoDelete works with that. I have
- Xheard that the funny instructions in DosBase have been replaced with a
- Xregular jump table.
- X
- X
- X WHY USE NODELETE?
- XI wrote this program mainly to make the fantastic public domain game
- X"Omega" more enjoyable to play. The author of this program thought it
- Xreasonable to have the system unlink the save-file after having reloaded it
- Xto somehow "simulate the continuity of character". Too bad that NoDelete
- Xdoes not work correctly with this program...
- XFootnote: It works now!
- X
- X WHAT IT DOES
- XNoDelete enables you erraneous humans to once again reflect on the
- Xrighteousness of your decisions concerning the deleting of files on
- XAmigaDos devices. If you try to delete a file or a program tries to remove
- Xit, this is mostly done via DeleteFile() of the dos.library. When
- Xexecuted, NoDelete bends this vector to its own routine which brings up
- Xthis cute little requester on the active window. This requester contains
- Xthe name of the file that the system is trying to delete. If you really
- Xwant to delete this file, click to the "Yes, Delete!" gadget. If not,
- Xclick to the "Oops, no way!"-Gadget of the requester. NoDelete works just
- Xfine with aliases, wildcards etc. For problems see the "known
- Xbugs"-section of this text.
- X
- X PATTERNS
- XLots of programs, programmers and normal people use patterns in their file
- Xsystem to be able to immediately make out the contents of a file. For
- Xexample, ".c" specifies the file to be a C source code and ".bas" should
- Xcontain a basic program's source. There are tons of frequently used
- Xextensions, from ".asm" up to ".cfg". If you use NoDelete and you don't
- Xwant the system to get on your nerves by confirming EVERY rm command, you
- Xshould use a certain extension on NoDelete's command line to tell NoDelete
- Xthat it should only ask confirmation for those precious ".c" or ".iff"
- Xfiles and let all others alone.
- X
- XThe new version of NoDelete also supports complete filenames as pattern
- Xmatching is done via PatternMatch() of ARP. The command line
- X
- X 1> run nodelete *.c
- X
- Xwould tell NoDelete to only intercept the removing of files ending in ".c"
- Xand not to worry about any other files that are removed from the device.
- X
- XYou can specifiy up to ten patterns when running NoDelete. The command
- X
- X 1> run NoDelete *.c *.iff *.tex *.asm
- X
- Xwill make NoDelete complain about any file which ends in one of the
- Xspecified patterns and leave all others alone. If you have forgotten which
- Xpatterns you specified at startup, just activate NoDelete's titlebar and
- Xpress any key. NoDelete will then give a list of patterns in the titlebar
- Xuntil another key is pressed.
- X
- XAnother one:
- X
- X 1> run NoDelete Peter Pecker picked a pepper
- X
- Xwould intercept any attempt to remove the files peter, pecker, picked, a,
- Xand pepper. NoDelete does discriminate between upper or lower case letters
- Xin filenames. If the extensions get too long to fit into the titlebar...
- Xwell, you won't see them!
- X
- XTo make things totally clear, let me cite the ARP programmer's manual:
- X
- XCITE
- Xarp.doc/PatternMatch (V31)
- X
- X NAME
- X PatternMatch - perform a wildcard match on a string
- X
- X SYNOPSIS
- X result = PatternMatch(pat,str)
- X D0 A0 A1
- X
- X FUNCTION
- X This function compares a string to the given pattern and determines
- X if it is a valid match. If so it returns a true result.
- X The pattern must be constructed with special preparsed tokens and
- X supports the following patterns:
- X (p1|p2|p3) One of the patterns p1, p2 or p3
- X ? Any single character
- X #<pat> Pattern repeated 0 or more times
- X [class] Character class
- X [^class] Negated character class
- X {pat} Structure tag for replacement
- X * 0 or more occurances of any character
- X
- X INPUTS
- X char *pat The pattern string to match against
- X char *str The string to be matched
- X
- X RESULT
- X result - a boolean value indicating success/failure. The condition
- X codes are guarenteed to reflect the status of the result
- X
- X BUGS
- X None known.
- X
- X SEE ALSO
- X
- X Author: JAT
- XEND CITE
- X
- XRight? So far for all the wildcards you can use with ARP. IMPORTANT NOTE:
- Xif you work with Csh or WB 1.3 shell, you will have to escape the
- Xcharacters special to these shells, respectively. To protect all C sources
- Xwhile in Csh, you would use the syntax
- X
- X $ run nodelete \*.c
- X
- Xto have the special shell wildcard "*" survive on its way to NoDelete.
- X
- X
- X
- X COMMAND LINE OPTIONS
- XFinally, HooverSoft is proud to have introduced command line options in
- XNoDelete. So far, four options are supported:
- X
- X-p number where number is an integer between -20 and 9. If given on
- X the command line, NoDelete will set its priority to this
- X value. If you type rubbish or use values not allowed, the
- X default priority of -5 is set.
- X
- X-y ypos where ypos is an integer ranging from zero to 245 (sorry,
- X all you NTSC users...). This number will determine the ver-
- X tical position of NoDelete's titlebar. if you try to fool
- X NoDelete or do not give this option, the default value zero
- X (top of screen) is used.
- X
- X-O Override file protection bit. If this option is given,
- X NoDelete will NOT care about the file's protection status.
- X This option is sort of dangerous, but I think if you are
- X explicitly asked wether you want to delete a file this
- X should be presto! wiped off the disk without return or
- X any other chance of survival..., Anyway, the default now
- X is to consider and respect the file protection.
- X
- X-S if given, this option tells NoDelete to shut up. No screams,
- X no comments!
- X
- X KNOWN BUGS
- XNoDelete cannot take care of the AmigaDos command Delete. God knows how
- Xthis command erases a disk file...
- X
- XThe Shell won't complain if you try to delete any non-existent file while
- XNoDelete has its grip on the system. This is not really a bug because
- XNoDelete works on this basis of cheating the calling function and
- Xpretending that everything is just fine and deleted. This also is the cause
- Xthat the calling program will not be informed if the file in question
- Xis delete protected.
- X
- X THE LEGAL STUFF
- XNoDelete is FreeWare and may be copied freely by everyone except for
- Xpurposes listed below as long as this notice is left intact. This program
- Xis copyright (C) by HooverSoft. It may NOT be copied or sold for
- Xcommercial purposes without written permssion by the author (Get lost,
- XCarsten Wolf and all you other sharks!). It may be distributed and copied
- Xfreely for non-commercial purposes only.
- X
- XWhen distributed, this program should always be accompanied by this file,
- Xthe documentation.
- X
- X FURTHER PLANS & HOPELESS DREAMS
- XI would like to use CreateTask() to launch a separate Task for Nodelete.
- XThis would unlink NoDelete's memory requirements from the current stacksize
- Xof the system. It would be nice if "delete" could also be disabled but I
- Xam not sure how to do this.
- X
- X CREDITS
- XI'm very thankful to all those people who have continued to make their
- Xsources available through FreeWare, especially Fred Fish, Udo K Schuermann
- X(The walrus and maintainer of Akvarium Data Files) and Matt Dillon.
- X
- X PUBLIC FEEDBACK
- XBug reports (cheers, Jensi & John!), criticism, comments and approvements
- Xshould be sent to
- X
- X SNAIL:
- X HooverSoft Inc.
- X Joellenbecker Weg 4
- X D-4900 Herford
- X Germany
- X
- X BITNET:
- X hoover@math4.uni-bielefeld.de
- X
- X DISCLAIMER
- XDo whatever you like with this program, but listen: you can't blaim it on
- Xme if anything goes down the drain!
- XHave fun,
- XHoover
- X
- X--
- X"It's impossible to make things foolproof because fools are so ingenious..."
- END_OF_FILE
- if test 10917 -ne `wc -c <'nodelete.doc'`; then
- echo shar: \"'nodelete.doc'\" unpacked with wrong size!
- fi
- # end of 'nodelete.doc'
- fi
- if test -f 'nodelete.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'nodelete.uu'\"
- else
- echo shar: Extracting \"'nodelete.uu'\" \(6418 characters\)
- sed "s/^X//" >'nodelete.uu' <<'END_OF_FILE'
- Xbegin 666 nodelete
- XM```#\P`````````#``````````(```0'````NP````$```/I```$!T[Z!\!3;
- XM>7-T96T@=')I97,@=&\@9F]O;"!A<F]U;F0N+BX``%EE<RP@1&5L971E(0``P
- XM3V]P<RP@3F\@5V%Y(0!.5?_V2.?__DZZ!^HI08*62JR``F=&0JR">F`T2&W_R
- XM]G(*("R">DZZ#AA![(%VT(@O`$ZZ!J)03R\L@I9(;?_V3KH&AE!/2D!G`F`49
- XM4JR">B`L@GJPK(`&9<)@`F`"8'I(>@#&2&R!)DZZ!GI03R\L@I9(;($F3KH*3
- XMEE!/2'H`N$AL@29.N@J(4$]![($F*4B`3B!L@H(I:``T@HI(>``]2'@!:$*G&
- XM0J=(;(!^2&R`:DAL@%8O+(**3KH.Y$_O`"`I0()Z2JR">F8*3-]__W`!3EU.<
- XM=4JL@GIG3"QL@HX@/```</<]0/^X(#Q@``"2+4#_NDJL@`IG"B(L@I9T`$ZNT
- XM_T8B+(*63J[_N$AZ_O1(>/^X+RR"CDZZ#B1/[P`,3-]__W`!8*I@J$1E;&5T2
- XM92!&:6QE(&``)S\``$Y5``!*K(`.9@HO+0`(3KH%8%A/0J="ITZZ#8Q83R\`#
- XM3KH-]%!/2JR"CF<8+&R"CB`\``!P]SU`_[@@/&```)(M0/^Z2JR"AF<*+RR",
- XMADZZ!3!83TJL@I)G"B\L@I).N@TH6$]"ITZZ"Q183TY=3G4L;(*.#*Y@``"2Q
- XM_[IF!'`!8`)P`$YU3E7__$*G2'H$'$ZZ#4Q03RE`@I)F"DAZ!!A.NO]>6$\@)
- XM;(*2*6@`,(*.(&R"DBEH`#B"@DAZ!!9(;((J3KH$YE!/*WP````!__Q@``&4C
- XM("W__.6`(&T`#")P"``,$0`M9@`!/B`M__SE@"!M``PB<`@`$"D``4B`2,!@9
- XM``$`("W__%*`Y8`@;0`,+S`(`$ZZ!+983["\````]6X:("W__%*`Y8`@;0`,J
- XM+S`(`$ZZ!)A83SE`@!12K?_\8``!("`M__Q2@.6`(&T`#"\P"`!.N@1V6$^P2
- XMO`````IL2"`M__Q2@.6`(&T`#"\P"`!.N@186$^PO/___^QO*B`M__Q2@.6`Q
- XM(&T`#"\P"`!.N@0Z6$\O`$*G3KH,"EA/+P!.N@QR4$]@%$AX__M"ITZZ"_184
- XM3R\`3KH,7%!/4JW__&```)XI?`````&`"F```)(I?`````&`#F```(8@+?_\)
- XMY8`@;0`,(G`(`!`I``%(@$C`+P!(>@+V3KH#=%!/8&"0O````$]GO%F`9\20[
- XMO````!UG`/\ND+P````)9P#^Y&"Z8#PI?`````&``@RL````"H`&9"8@+?_\#
- XMY8`@;0`,+S`(`'(*("R`!DZZ"KA![(%VT(@O`$ZZ`U!03U*L@`92K?_\("W_L
- XM_+"M``AM`/YD2JR`!F<02'H"B$AL@BI.N@=24$]@$D*L@`)(>@)]2&R"*DZZ:
- XM!SY03TAL@BI.N@,:6$_G@-"\````53E`@!8@/````H`R+(`62,&0@7("3KH(7
- XM$CE`@!)*K(`.9@HO+("23KH"G%A/3KK]EDJ`9C!(>@(Q3KH"BEA/+RR"CDZZI
- XM"IA83R\L@H).N@J.6$\O+(*23KH*A%A/0J=.N@AP6$](;(`23KH+;%A/*4"""
- XMADJL@H9F"DAZ`@I.NOS66$]*K(`.9@HO+("63KH"-EA/2'K[ADAX_[@O+(*.T
- XM3KH*MD_O``P@;(*&(F@`5G``$"D`#W(!X:$O`4ZZ"KY83R!L@H8O*`!63KH*M
- XM6%A/*4""?B\L@GY.N@IN6$\@;()^#*@```(``!1F"DAZ`;%.NOQD6$\@;()^_
- XM#*@`(````!1F``":2'H!L4AL@=I.N@'P4$]"K?_\8"YR"B`M__Q.N@DZ0>R!X
- XM=M"(+P!(;(':3KH%^%!/2'H!C$AL@=I.N@7J4$]2K?_\("W__+"L@`9ER$ALI
- XM@=HO+(*&3KH*B%!/(&R"AB)H`%9P`!`I``]R`>&A+P%.N@H&6$](;((J+RR"$
- XMADZZ"F!03R!L@H8O*`!63KH)DEA/+P!.N@FN6$]@`/\(3EU.=4EN<W1A;&QI,
- XM;F<@3F]$96QE=&4N+BX`9&]N92X@3F]$96QE=&4@5C$N-4$@J2!(;V]V97)3-
- XM;V9T(#$Y.3$N(%1H:7,@4')O9W)A;2!I<R!&4D5%5T%212X*`&%R<"YL:6)R:
- XM87)Y`$YO1&5L971E(&YE961S(&%R<"YL:6)R87)Y"@!.;T1E;&5T92!6,2XUU
- XM02"I($AO;W9E<E-O9G0`56YK;F]W;B!/<'1I;VX@+25C"@`@4$%4(%-%5``@2
- XM3D\@4$%4`$YO1&5L971E(&%L<F5A9'D@:6YS=&%L;&5D+@H`0V]U;&0@;F]TT
- XM(&]P96X@5VEN9&]W+@H*`$YO1&5L971E(%8Q+C5!(&5X:71I;F<N"@H`4&%T&
- XM=&5R;G,Z(``@`"!O``1#[P`(+&R"DD[N_QQ,[P,```0L;(*23N[^U$SO`P``P
- XM!"QL@I).[OY03.\#```$+&R"DD[N_=(@;P`$(`@B;P`($-EF_$YU(&\`!"`(0
- XM2AAF_)'`(`A3@$YU3E4``$CG#"`D;0`(#!(`(&<!(`"68$4HI@\'H`#!(`J
- XM+68&>@%2BF`(#!(`*V8"4HIX`&`@($I2BA`02(!(P'(*+P`@!$ZZ!O(B']*`U
- XM*`&8O````#`0$DB`2,!![(";"#```@@`9LY*A6<&(`1$@&`"(`1,WP0P3EU.?
- XM=6%P0^R!)D7L@2:UR68.,CP`<6L(=``BPE')__PI3X*:+'@`!"E.@IY(YX"`G
- XM""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS0_H`($ZN_F@I0(*B9@PN/``#@`=.G
- XMKO^48`1.N@`:4$].=61O<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``R
- XM,"R!','\``8O`$ZZ!KXI0(*F4$]F%$*G2'D``0``3KH&@E!/+FR"FDYU(&R""
- XMID)H``0@;(*F,7P``0`0(&R"IC%\``$`"B!L@IH@+(*:D*@`!%"`*4""JB!LO
- XM@JH@O$U!3EA"ITZZ!G8D0$JJ`*Q83V<P+RT`#"\M``@O"DZZ`+(I?`````&"2
- XMKB!L@J8`:(````0@;(*F`&B````*3^\`#&!"2&H`7$ZZ!KQ(:@!<3KH&5"E`1
- XM@K(@;(*R2J@`)%!/9Q`@;(*R(F@`)"\13KH%FEA/+RR"LB\*3KH">"EL@K*"Q
- XMME!/3KH%CB!L@J8@@$ZZ!9H@;(*F(4``!F<62'@#[4AZ`"Q.N@5V(&R"IB%`Y
- XM``Q03R\L@K8O+(*Z3KKXG$*G3KH#C$_O``PD7TY=3G4J`$Y5``!(YPPP)&T`U
- XM$"!M``A*J`"L9Q@@;0`(("@`K.6`*``@1"`H`!#E@"9`8`0F;($>$!-(@$C`G
- XMT*T`#%2`*4""OD*G+RR"ODZZ!5`I0(+"4$]F"$S?##!.74YU$!-(@$C`*@`O"
- XM!2!+4H@O""\L@L).N@&.(&R"PM'%0_H!6!#99OPO+0`,+PHO+(+"3KH!3B!LA
- XM@L)",%@`*7P````!@KH@;(+"T<4F2%*+)$M/[P`8$!-(@$C`*@"PO````"!GV
- XM(+J\````"6<8NKP````,9Q"ZO`````UG"+J\````"F8$4HM@S`P3`"!M``",T
- XM#!,`(F8R4HL@2U*+$!!(@$C`*@!G("!*4HH0A;J\````(F80#!,`(F8$4HM@P
- XM!D(J__]@`F#28$0@2U*+$!!(@$C`*@!G,+J\````(&<HNKP````)9R"ZO```"
- XM``QG&+J\````#6<0NKP````*9P@@2E**$(5@PB!*4HI"$$J%9@)3BU*L@KI@X
- XM`/\\0A)"IR`L@KI2@.6`+P!.N@04*4""ME!/9@A"K(*Z8`#^OGH`)FR"PF`>(
- XM(`7E@"!L@K8ABP@`($L@"$H89OR1P%.(4HC7R%*%NJR"NFW<(`7E@"!L@K9"0
- XML`@`8`#^@B``,#Q__V`$,"\`#B!O``1*&&;\4T@B;P`(4T`0V5?(__QG`D(0/
- XM("\`!$YU3.\#```$(`@B+P`,8`(0V5?)__QG!E)!8`)"&%')__Q.=4Y5``!("
- XMYPXP)&T`"$*G2'H`CDZZ`ZXI0(+&4$]F"$S?#'!.74YU(&T`#")H`"0O*0`$F
- XM3KH$!"@`6$]G4DAZ`&T@1"\H`#9.N@/6)D!*@%!/9S1(>`/M+PM.N@+0+`!0#
- XM3V<D(`;E@"H`($4E:``(`*0E1@"<2'@#[4AZ`#A.N@*L)4``H%!/+P1.N@.B8
- XM6$\O+(+&3KH"U$*L@L983V"`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$CG2`!"L
- XMA$J`:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(YT@`0H1*@&H$^
- XM1(!21$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`3G5(YS``2$%*3
- XM068@2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(028!(@!"04A!`
- XM2$!"0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=4Y5``!*K(+*9P8@;(+*3I`OR
- XM+0`(3KH`"%A/3EU.=4Y5__PO!"MM``C__$JL@J9G+'@`8`HO!$ZZ`/Q83U*$-
- XM,"R!'$C`N(!M[#`L@1S!_``&+P`O+(*F3KH!ZE!/2JR"SF<&(&R"SDZ02JR!V
- XM(F<*+RR!(DZZ`7!83TJL@M)G""!L@M(@K(+62JR"VF<*+RR"VDZZ`7Y83TJL,
- XM@MYG"B\L@MY.N@%N6$]*K(+B9PHO+(+B3KH!7EA/2JR"YF<*+RR"YDZZ`4Y8#
- XM3RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS2JR"LF8J2JR"PF<BF
- XM+RR"OB\L@L).N@%&("R"NE*`Y8`O`"\L@K9.N@$T3^\`$&`.3KH!(B\L@K).+
- XMN@%:6$\@+?_\+FR"FDYU*!].74YU3E4``$CG#B`H+0`(<@8@!$ZZ`$0D0-7L<
- XM@J9*A&T.,"R!'$C`N(!L!$J29A(I?`````*"ZG#_3-\$<$Y=3G4P*@`$P'R`7
- XM`&8(+Q).N@`N6$]"DG``8.!(YW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`:
- XMT(),WP`.3G4B+P`$+&R"HD[N_]PB+P`$+&R"HD[N_X(L;(*B3N[_RDSO``8`&
- XM!"QL@J).[O_B+&R"HD[N_\1.^@`"(B\`!"QL@J).[O^F2.<!!$SO((``#"QL'
- XM@IY.KO^43-\@@$YU3OH``B)O``0L;(*>3N[^8DSO``,`!"QL@IY.[O\Z3OH`G
- XM`B)O``0L;(*>3N[^VBQL@IY.[O]\(F\`!"`O``@L;(*>3N[_+D[Z``(@;P`$\
- XM+&R"GD[N_HQ.^@`"+&R"GB)O``0@+P`(3N[]V$[Z``(B;P`$+&R"GD[N_H8BV
- XM;P`$(&\`""`O``PL;(*>3N[^7")O``0@+P`(+&R"GD[N_M0@+P`$+&R"GD[NL
- XM_L(@;P`$+&R"GD[N_H!,[P,```0L;(+&3N[_H"!O``0L;(+&3N[_IB!O``0L5
- XM;(+&3N[_LDCG`#!,[P\```Q,[P`/`!PL;(*"3J[^I$S?#`!.=2!O``0L;(*"?
- XM3N[_-"\*3.\'```(+&R"@DZN_NPD7TYU```#[`````$````!```(-@``````I
- XM``/R```#Z@```$D``````````````````````&0```%>``H``0`@`@````!.I
- XM``````````````(H````````````!0`%`H``;@`!`0`"```>`!``````````6
- XM```````!``(``!X`!0`````````$````0`$``@``!@`#`````````"0`````:
- XM`0`"```&``,`````````,@````````7*```%X0`@("`@("`@("`P,#`P,"`@#
- XM("`@("`@("`@("`@("`@()!`0$!`0$!`0$!`0$!`0$`,#`P,#`P,#`P,0$!`(
- XM0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!`0$!`0$!0$!`0$!`"@H*"@H*`@(",
- XM`@("`@("`@("`@("`@("`@)`0$!`(```%``````````````#[`````(````!(
- XM````*@```&0````%`````````&````!T````B````)````"4`````````_(`(
- X+``/K`````0```_(%I
- X``
- Xend
- Xsize 4556
- END_OF_FILE
- if test 6418 -ne `wc -c <'nodelete.uu'`; then
- echo shar: \"'nodelete.uu'\" unpacked with wrong size!
- fi
- # end of 'nodelete.uu'
- fi
- echo shar: End of archive 1 \(of 1\).
- cp /dev/null ark1isdone
- MISSING=""
- for I in 1 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have the archive.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
- --
- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
- Mail comments to the moderator at <amiga-request@uunet.uu.net>.
- Post requests for sources, and general discussion to comp.sys.amiga.misc.
-